package com.itheima.controller;

import com.alibaba.druid.sql.visitor.functions.If;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.common.GlobalConstant;
import com.itheima.common.R;
import com.itheima.entity.Category;
import com.itheima.service.ICategoryService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.websocket.server.PathParam;
import java.util.List;

/**
 * category表示层
 *
 * @author hua
 * @since 2022/11/2 12:22
 */
@Slf4j
@RestController
@RequestMapping("/category")
public class CategoryController {
    @Autowired
    private ICategoryService categoryService;
    //1. 请求路径
    //2. 请求方式
    //3. 请求参数
    //4. 返回值

    /**
     * 新增分类
     * @param categoryParam
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody Category categoryParam){
        log.info("//前后端联通");
        log.info("categoryParam:===>{}",categoryParam.toString());
        //参数校验
        //分类名称
        boolean checkParam = this.checkParam(categoryParam);
        if (!checkParam){
            return R.error(GlobalConstant.FAILED);
        }
        boolean isFinished = this.categoryService.save(categoryParam);
//        if (isFinished)
//            return R.success(GlobalConstant.SUCCESS);
//        else {
//            return R.error(GlobalConstant.FAILED);
//        }
        return isFinished ?
                R.success(GlobalConstant.SUCCESS)
                : R.error(GlobalConstant.FAILED);
    }

    /**
     * 参数校验
     * @param categoryParam
     * @return
     */
  private Boolean checkParam(Category categoryParam){
        if (StringUtils.isBlank(categoryParam.getName())){
        return Boolean.FALSE;
        }
        if (categoryParam.getSort() == null){
            return Boolean.FALSE;
        }
        if (categoryParam.getType() ==null){
            return Boolean.FALSE;
        }
        return Boolean.TRUE;
  }
  @GetMapping("/page")
  public R<Page<Category>> getPage(Integer page,Integer pageSize){
        log.info("前端联通");
        //要有page分页对象,在这个对象中
      //要赋值:当前页为current，和当前要显示多少行Size
        //分页构造器
      Page<Category> queryPage = new Page<>(page, pageSize);
      //当前页
       queryPage.setCurrent(page);
       //当前页要显示多少行
      queryPage.setSize(pageSize);
      //排序的条件
      LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
      //根据sort字段做升序
       queryWrapper.orderByAsc(Category::getSort);
      Page<Category> result = this.categoryService.page(queryPage, queryWrapper);
      //会把查询到的结果,保存到分页对象中
      //我们也可以用返回值的方式来写
      //也可以使用分页对象返回数据
    //     this.categoryService.page(queryPage,queryWrapper);
      return R.success(result);
  }
/**
 * 删除分类
 */
@DeleteMapping
public R<String>  delete(long id){
    //1. 请求路径
    //2. 请求方式
    //3. 请求参数
    //4. 返回值
    //this.categoryService.removeById(id);
    this.categoryService.deleteById(id);
    return R.success(GlobalConstant.SUCCESS);
}

    /**
     * 修改
     * @param categoryParam
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody Category categoryParam){
        //1. 请求路径
        //2. 请求方式
        //3. 请求参数
        //4. 返回值
        this.categoryService.updateById(categoryParam);
    return R.success(GlobalConstant.SUCCESS);
}

        /**
         * 查询分类列表
         */
        @GetMapping("/list")
        public R<List<Category>> getCategoryList(Category categoryParam) {
            log.info("前后端连通");
            //拼接查询条件
            LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
            //这个type,有可能是不传递的
            //如果不为空,在拼接这个条件
//    if (categoryParam.getType() !=null){
//        queryWrapper.eq(Category::getType,categoryParam.getType());
//    }
            //这种写法等同于if的写法
            queryWrapper.eq(categoryParam.getType() != null, Category::getType, categoryParam.getType());
            //在这里使用链式编程的方式,来完成多个排序条件的拼接
            //sort 升序
            //修改时间 倒序
            //sql 升序 ASC
            //sql 倒序  DESC
            //SELECT * FROM category WHERE(type =?) ORDER BY sort ASC,update_time DESC
            queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
            //查询分类
            List<Category> categoryList = this.categoryService.list(queryWrapper);
            return R.success(categoryList);
        }
    }

